记录一次极其难受的c#端调用sqlite触发database is locked的历程 您所在的位置:网站首页 get database lock error 记录一次极其难受的c#端调用sqlite触发database is locked的历程

记录一次极其难受的c#端调用sqlite触发database is locked的历程

2023-09-29 16:20| 来源: 网络整理| 查看: 265

情况是这样的,因为公司产品需要,写了一个多线程抽取本地sqlite的的方法。 详情不表,之前使用也一直成功。 直到本次更新,需要检测老客户的本地sqlite表中是否有一个字段,如果没有则添加该字段,且update这个字段的值。 然后后面接正常的遍历注册表添加到sqlite的过程。 就是这里,频繁的报错了,一开始把加字段放在前面,把插入放在后面。然后就会发现,字段能正常加,但在表中有数据的情况下,如果再执行插入则会提示database is locked。 调试,发现,就算字段已经存在了,没有执行加字段,执行插入数据时,还是会提示database is locked。

调试*2,清空表内数据,正常插入数据,正常。

调试*2,删除表内一条记录,已有字段,执行插入,提示database is locked。

调试了一下午,百度了各种方案,包括lock,using,Monitor.Enter(obj)。

无效,于是最后想到了顺序问题,把已有字段情况下,先执行插入,后执行检测字段。插入正常。

于是联想到之前sqlite的特性,多读单写,没想到自己会栽在这里。(之前的加字段和插入是写了两个using的)

于是合并,同一个using下多读多写,反复横跳,正常,无报错。 贴部分代码吧……后人勿要再触发同样的错误了。

lock (lockcx) { using (SQLiteConnection con = new SQLiteConnection(DB_PATH)) //using (SQLiteConnection con = SqliteConn.GetInstance().GetConnection(DB_PATH)) { con.Open(); //richTextBox1.Text += "3333\r\n"; sqlStr = "Select * From MAIN.[upt


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有